/*
 * Copyright (C) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup Drm
 * @{
 *
 * @brief 提供数字版权保护能力的API。
 * @kit Drm.
 * @since 11
 * @version 1.0
 */

/**
 * @file native_mediakeysession.h
 * @brief 定义Drm MediaKeySession API。提供以下功能：
 * 生成媒体密钥请求、处理媒体密钥响应、事件侦听、获取内容保护级别、
 * 检查媒体密钥状态、删除媒体密钥等。
 * @library libnative_drm.z.so
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */

#ifndef OHOS_DRM_NATIVE_MEDIA_KEY_SESSION_H
#define OHOS_DRM_NATIVE_MEDIA_KEY_SESSION_H

#include <stdint.h>
#include <stdio.h>
#include "native_drm_err.h"
#include "native_drm_common.h"

#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @brief 事件触发时将调用的回调。
 * @param eventType 事件类型。
 * @param eventInfo 从MediaKeySystem中获取的事件信息。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
typedef  Drm_ErrCode (*MediaKeySession_EventCallback)(DRM_ListenerType eventType, DRM_Uint8CharBufferPair *eventInfo);

/**
 * @brief 注册监听，监听密钥变化。
 * @param keysInfo 密钥信息。
 * @param newKeysAvailable 新密钥释放可用。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
typedef  Drm_ErrCode (*MediaKeySession_KeyChangeCallback)(DRM_KeysInfo *keysInfo, bool newKeysAvailable);

/**
 * @brief MediaKeySession回调结构体, 用来监听密钥过期、密钥变化等事件。
 * @since 11
 * @version 1.0
 */
typedef struct MediaKeySession_Callback {
    /**
     * KeySession回调事件，如许可证过期。
     */
    MediaKeySession_EventCallback eventCallback;
    /**
     * 密钥变化事件触发的keyChange事件。
     */
    MediaKeySession_KeyChangeCallback keyChangeCallback;
} MediaKeySession_Callback;

/**
 * @brief 生成许可证请求。
 * @param mediaKeySession mediaKeySession实例。
 * @param info 许可证请求信息。
 * @param mediaKeyRequest 许可证请求
 * @return Drm_ErrCode.
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_GenerateMediaKeyRequest(MediaKeySession *mediaKeySession,
    DRM_MediaKeyRequestInfo *info, DRM_MediaKeyRequest **mediaKeyRequest);

/**
 * @brief 处理许可证响应。
 * @param mediaKeySession mediaKeySession实例。
 * @param response 许可证响应。
 * @param mediaKeyId 许可证Id。
 * @param mediaKeyIdLen 许可证Id长度。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_ProcessMediaKeyResponse(MediaKeySession *keySession,
    DRM_Uint8Buffer *response, unsigned char **mediaKeyId, int32_t *mediaKeyIdLen);

/**
 * @brief 检查许可证状态.
 * @param mediaKeySession mediaKeySession实例。
 * @param mediaKeyDescription 许可证状态描述。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_CheckMediaKeyStatus(MediaKeySession *mediaKeySessoin,
    DRM_MediaKeyDescription **mediaKeyDescription);

/**
 * @brief 清除当前会话的许可证 .
 * @param mediaKeySession mediaKeySession实例。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_ClearMediaKeys(MediaKeySession *mediaKeySessoin);

/**
 * @brief 生成离线许可证释放请求。
 * @param mediaKeySession mediaKeySession实例。
 * @param mediaKeyId 许可证Id。
 * @param releaseRequest 离线许可证请求。
 * @param releaseRequestLen 离线许可证请求长度。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_GenerateOfflineReleaseRequest(MediaKeySession *mediaKeySessoin,
    DRM_Uint8Buffer *mediaKeyId, unsigned char **releaseRequest, int32_t *releaseRequestLen);

/**
 * @brief 处理离线许可证释放响应。
 * @param mediaKeySession mediaKeySession实例。
 * @param mediaKeyId 许可证Id。
 * @param releaseReponse 许可证响应。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_ProcessOfflineReleaseResponse(MediaKeySession *mediaKeySessoin,
    DRM_Uint8Buffer *mediaKeyId, DRM_Uint8Buffer *releaseReponse);

/**
 * @brief 根据许可证ID恢复对应许可证状态。
 * @param mediaKeySession mediaKeySession实例。
 * @param mediaKeyId 许可证Id。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_RestoreOfflineMediaKeys(MediaKeySession *mediaKeySessoin,
    DRM_Uint8Buffer *mediaKeyId);

/**
 * @brief 获取当前会话的内容保护级别。
 * @param mediaKeySession mediaKeySession实例。
 * @param contentProtectionLevel 内容保护级别。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_GetContentProtectionLevel(MediaKeySession *mediaKeySessoin,
    DRM_ContentProtectionLevel *contentProtectionLevel);

/**
 * @brief 查询是否需要安全解码.
 * @param mediaKeySession mediaKeySession实例。
 * @param mimeType 媒体类型。
 * @param status 是否安全解码。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_RequireSecureDecoderModule(MediaKeySession *mediaKeySessoin,
    const char *mimeType, bool *status);

/**
 * @brief 设置MediaKeySession事件回调。
 * @param mediaKeySession mediaKeySession实例。
 * @param callback 设置到MediaKeySession中的回调.
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_SetMediaKeySessionCallback(MediaKeySession *mediaKeySessoin,
    MediaKeySession_Callback *callback);

/**
 * @brief MediaKeySession资源销毁.
 * @param mediaKeySession mediaKeySession实例。
 * @return 参数检查错误返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySession_Destroy(MediaKeySession *mediaKeySessoin);

#ifdef __cplusplus
}
#endif

#endif // OHOS_DRM_NATIVE_MEDIA_KEY_SYSTEM_H